<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <p data-lake-id="u6d9e0a8a" id="u6d9e0a8a"><span data-lake-id="u0851b9e4" id="u0851b9e4">kafka是一个成熟的消息队列，一直以性能高著称，它之所以能够实现高吞吐量和低延迟，主要是由于以下几个方面的优化，我试着从发送端，存储端以及消费端分别介绍一下。</span></p>
  <p data-lake-id="u1002ccfa" id="u1002ccfa"><span data-lake-id="u5122749c" id="u5122749c">​</span><br></p>
  <h3 data-lake-id="ePoDy" id="ePoDy"><span data-lake-id="ub7884d10" id="ub7884d10">消息发送</span></h3>
  <p data-lake-id="ub3522fdf" id="ub3522fdf"><span data-lake-id="u7d96f4d5" id="u7d96f4d5">​</span><br></p>
  <ol list="uf6d1e3b0">
   <li fid="uef9d9a53" data-lake-id="u6ad386de" id="u6ad386de" data-lake-index-type="true"><strong><span data-lake-id="u369bd91d" id="u369bd91d">批量发送</span></strong><span data-lake-id="ua983802e" id="ua983802e">：Kafka 通过将多个消息打包成一个批次，减少了网络传输和磁盘写入的次数，从而提高了消息的吞吐量和传输效率。</span></li>
   <li fid="uef9d9a53" data-lake-id="u4ac507df" id="u4ac507df" data-lake-index-type="true"><strong><span data-lake-id="u3d130ddc" id="u3d130ddc">异步发送</span></strong><span data-lake-id="u99719cc3" id="u99719cc3">：生产者可以异步发送消息，不必等待每个消息的确认，这大大提高了消息发送的效率。</span></li>
   <li fid="uef9d9a53" data-lake-id="ub5436191" id="ub5436191" data-lake-index-type="true"><strong><span data-lake-id="u1f1bc21b" id="u1f1bc21b">消息压缩</span></strong><span data-lake-id="u9c070cb4" id="u9c070cb4">：支持对消息进行压缩，减少网络传输的数据量。</span></li>
   <li fid="uef9d9a53" data-lake-id="udc59d8f9" id="udc59d8f9" data-lake-index-type="true"><strong><span data-lake-id="u85683cda" id="u85683cda">并行发送</span></strong><span data-lake-id="uf649bf95" id="uf649bf95">：通过将数据分布在不同的分区（Partitions）中，生产者可以并行发送消息，从而提高了吞吐量。</span></li>
  </ol>
  <p data-lake-id="u9d40635d" id="u9d40635d"><span data-lake-id="u9edc2fd9" id="u9edc2fd9" class="lake-fontsize-12" style="color: rgb(55, 65, 81)">​</span><br></p>
  <h3 data-lake-id="GTnkH" id="GTnkH"><span data-lake-id="u4ea63fdb" id="u4ea63fdb" style="color: rgb(55, 65, 81)">消息存储</span></h3>
  <p data-lake-id="u80930a08" id="u80930a08"><span data-lake-id="u3a294cba" id="u3a294cba">​</span><br></p>
  <ol list="uef074aa5">
   <li fid="u428781e2" data-lake-id="u8efdeeda" id="u8efdeeda" data-lake-index-type="true"><strong><span data-lake-id="u57fd4840" id="u57fd4840">零拷贝技术</span></strong><span data-lake-id="udfa5a248" id="udfa5a248">：Kafka 使用零拷贝技术来避免了数据的拷贝操作，降低了内存和 CPU 的使用率，提高了系统的性能。</span></li>
  </ol>
  <p data-lake-id="u766291d8" id="u766291d8"><br></p>
  <ol list="uef074aa5" start="2">
   <li fid="u428781e2" data-lake-id="uc22c9f33" id="uc22c9f33" data-lake-index-type="true"><strong><span data-lake-id="ucdee2ba0" id="ucdee2ba0">磁盘顺序写入</span></strong><span data-lake-id="u83018b6f" id="u83018b6f">：Kafka把消息存储在磁盘上，且以顺序的方式写入数据。顺序写入比随机写入速度快很多，因为它减少了磁头寻道时间。避免了随机读写带来的性能损耗，提高了磁盘的使用效率。</span></li>
  </ol>
  <p data-lake-id="u0e2cc5a0" id="u0e2cc5a0"><br></p>
  <ol list="uef074aa5" start="3">
   <li fid="u428781e2" data-lake-id="u14c64ca8" id="u14c64ca8" data-lake-index-type="true"><strong><span data-lake-id="ufd980f22" id="ufd980f22">页缓存</span></strong><span data-lake-id="u0409acd2" id="u0409acd2">：Kafka 将其数据存储在磁盘中，但在访问数据时，它会先将数据加载到操作系统的页缓存中，并在页缓存中保留一份副本，从而实现快速的数据访问。</span></li>
  </ol>
  <p data-lake-id="u45804ce8" id="u45804ce8"><br></p>
  <ol list="uef074aa5" start="4">
   <li fid="u428781e2" data-lake-id="u9c98376a" id="u9c98376a" data-lake-index-type="true"><strong><span data-lake-id="u0dff6adf" id="u0dff6adf">稀疏索引</span></strong><span data-lake-id="u5f6675d4" id="u5f6675d4">：Kafka 存储消息是通过分段的日志文件，每个分段都有自己的索引文件。这些索引文件中的条目不是对分段中的每条消息都建立索引，而是每隔一定数量的消息建立一个索引点，这就构成了稀疏索引。稀疏索引减少了索引大小，使得加载到内存中的索引更小，提高了查找特定消息的效率。</span></li>
  </ol>
  <p data-lake-id="u1819337c" id="u1819337c"><br></p>
  <ol list="uef074aa5" start="5">
   <li fid="u428781e2" data-lake-id="u353c364c" id="u353c364c" data-lake-index-type="true"><strong><span data-lake-id="u5e53e29e" id="u5e53e29e">分区和副本</span></strong><span data-lake-id="ude2b1126" id="ude2b1126">：Kafka 采用分区和副本的机制，可以将数据分散到多个节点上进行处理，从而实现了分布式的高可用性和负载均衡。</span></li>
  </ol>
  <p data-lake-id="u61fc907f" id="u61fc907f"><br></p>
  <p data-lake-id="u778340c0" id="u778340c0"><br></p>
  <h3 data-lake-id="VHaLl" id="VHaLl"><span data-lake-id="u18a3caf9" id="u18a3caf9">消息消费</span></h3>
  <ol list="u00452a67">
   <li fid="ub294a852" data-lake-id="uded55231" id="uded55231" data-lake-index-type="true"><strong><span data-lake-id="u269685dc" id="u269685dc">消费者群组</span></strong><span data-lake-id="u85b3f176" id="u85b3f176">：通过消费者群组可以实现消息的负载均衡和容错处理。</span></li>
   <li fid="ub294a852" data-lake-id="ud28a8051" id="ud28a8051" data-lake-index-type="true"><strong><span data-lake-id="ufb0548c4" id="ufb0548c4" class="lake-fontsize-12" style="color: var(--tw-prose-bold)">并行消费</span></strong><span data-lake-id="u7e9e5365" id="u7e9e5365" class="lake-fontsize-12" style="color: rgb(55, 65, 81)">：不同的消费者可以独立地消费不同的分区，实现消费的并行处理。</span></li>
   <li fid="ub294a852" data-lake-id="u59b8a3f2" id="u59b8a3f2" data-lake-index-type="true"><strong><span data-lake-id="u441cdcea" id="u441cdcea" class="lake-fontsize-12" style="color: rgb(55, 65, 81)">批量拉取</span></strong><span data-lake-id="ued8c0b3a" id="ued8c0b3a">：Kafka支持批量拉取消息，可以一次性拉取多个消息进行消费。减少网络消耗，提升性能</span></li>
  </ol>
  <p data-lake-id="u2399a12c" id="u2399a12c"><span data-lake-id="uf01c74b6" id="uf01c74b6">​</span><br></p>
  <p data-lake-id="u03fedd56" id="u03fedd56"><span data-lake-id="ua5d343de" id="ua5d343de">​</span><br></p>
  <table data-lake-id="cZRdH" id="cZRdH" width-mode="contain" class="lake-table" style="width: 749.9884643554688px">
   <colgroup>
    <col width="249">
    <col width="249">
    <col width="251.98846435546875">
   </colgroup>
   <tbody>
    <tr data-lake-id="u42675b14" id="u42675b14" style="height: 36px">
     <td data-lake-id="u217acaf8" id="u217acaf8">
      <p data-lake-id="ue04e5ef9" id="ue04e5ef9"><strong><span data-lake-id="u8ce3f75c" id="u8ce3f75c">生产消息</span></strong></p></td>
     <td data-lake-id="u8470aa04" id="u8470aa04">
      <p data-lake-id="u66e8a7a8" id="u66e8a7a8"><strong><span data-lake-id="uf99b15fa" id="uf99b15fa">存储消息</span></strong></p></td>
     <td data-lake-id="u118057df" id="u118057df">
      <p data-lake-id="u3fdbbb2a" id="u3fdbbb2a"><strong><span data-lake-id="u7421f77f" id="u7421f77f">消费消息</span></strong></p></td>
    </tr>
    <tr data-lake-id="uccccac40" id="uccccac40">
     <td data-lake-id="ua1c76eaa" id="ua1c76eaa">
      <p data-lake-id="ud8f10deb" id="ud8f10deb"><span data-lake-id="ub1a576f6" id="ub1a576f6">批量发送</span></p></td>
     <td data-lake-id="ubb0129ed" id="ubb0129ed">
      <p data-lake-id="uaf7e6091" id="uaf7e6091"><span data-lake-id="u893b0508" id="u893b0508">磁盘顺序写入</span></p></td>
     <td data-lake-id="u34116a5e" id="u34116a5e">
      <p data-lake-id="u5c643d85" id="u5c643d85"><span data-lake-id="u17d6d0b5" id="u17d6d0b5">消费者群组</span></p></td>
    </tr>
    <tr data-lake-id="u49de7f7e" id="u49de7f7e">
     <td data-lake-id="ucb6ef98e" id="ucb6ef98e">
      <p data-lake-id="u86ec82ed" id="u86ec82ed"><span data-lake-id="u3de34a9e" id="u3de34a9e">异步发送</span></p></td>
     <td data-lake-id="u585faec6" id="u585faec6">
      <p data-lake-id="u32a8df75" id="u32a8df75"><span data-lake-id="u90ab1e5f" id="u90ab1e5f">页缓存</span></p></td>
     <td data-lake-id="uab5633e1" id="uab5633e1">
      <p data-lake-id="ubc0fdeac" id="ubc0fdeac"><span data-lake-id="u79e4fa91" id="u79e4fa91">批量拉取</span></p></td>
    </tr>
    <tr data-lake-id="u135beb66" id="u135beb66">
     <td data-lake-id="u21380b36" id="u21380b36">
      <p data-lake-id="u8bd9cd15" id="u8bd9cd15"><span data-lake-id="u57fc0bbd" id="u57fc0bbd">消息压缩</span></p></td>
     <td data-lake-id="u11b0cf75" id="u11b0cf75">
      <p data-lake-id="u7a3994d9" id="u7a3994d9"><span data-lake-id="uc7108090" id="uc7108090">稀疏索引</span></p></td>
     <td data-lake-id="u5953b160" id="u5953b160">
      <p data-lake-id="u4c78fb9c" id="u4c78fb9c"><span data-lake-id="u45d28196" id="u45d28196">并行消费</span></p></td>
    </tr>
    <tr data-lake-id="u8910318a" id="u8910318a">
     <td data-lake-id="uc7612951" id="uc7612951">
      <p data-lake-id="u12e6a0dc" id="u12e6a0dc"><span data-lake-id="ud39eb73d" id="ud39eb73d">并行发送</span></p></td>
     <td data-lake-id="u6d0b6d0d" id="u6d0b6d0d">
      <p data-lake-id="uafd961ad" id="uafd961ad"><span data-lake-id="u5ce0c65d" id="u5ce0c65d">零拷贝</span></p></td>
     <td data-lake-id="ua13a09a4" id="ua13a09a4"></td>
    </tr>
    <tr data-lake-id="ua271b922" id="ua271b922">
     <td data-lake-id="u7ad511b4" id="u7ad511b4"></td>
     <td data-lake-id="uca1fdf33" id="uca1fdf33">
      <p data-lake-id="ubc923b07" id="ubc923b07"><span data-lake-id="u679b423b" id="u679b423b">分区和副本</span></p></td>
     <td data-lake-id="ub7ca9c34" id="ub7ca9c34"></td>
    </tr>
   </tbody>
  </table>
 </body>
</html>